﻿//class SmartPtr
//{
//public:
//	SmartPtr(int* ptr)
//		:_ptr(ptr)
//	{}
//
//	~SmartPtr()
//	{
//		cout << "delete[] _ptr" << endl;
//		delete[] _ptr;
//	}
//private:
//	int* _ptr;
//};
//
//void fxx()
//{
//	SmartPtr sp1(new int[10]); //若这里的new抛异常，将不会走构造，
//	SmartPtr sp2(new int[10]); //若这里不抛异常，构造完之后析构会释放空间
//	SmartPtr sp3(new int[10]); //即借助构造函数保存资源，析构函数释放资源
//
//	int x, y;
//	cin >> x >> y;
//	Division(x, y);
//}
//int main()
//{
//	try
//	{
//		fxx();
//	}
//	catch (const char* errmsg)
//	{
//		cout << errmsg << endl;
//	}
//
//	return 0;
//}

//#include <iostream>
//#include <string>
//using namespace std;
//template<class T>
//class SmartPtr //使用RAII思想设计的SmartPtr类
//{
//public:
//	//构造函数保存资源
//	SmartPtr(T* ptr = nullptr)
//		: _ptr(ptr)
//	{	}
//	//析构函数释放资源
//	~SmartPtr()
//	{
//		if (_ptr)
//		{
//			cout << "delete _ptr" << endl;
//			delete _ptr;
//		}
//	}
//
//	//指针行为
//	T& operator*()
//	{
//		return *_ptr;
//	}
//	T* operator->()
//	{
//		return _ptr;
//	}
//private:
//	T* _ptr;
//};
//int div()
//{
//	int a, b;
//	cin >> a >> b;
//	if (b == 0)
//		throw invalid_argument("除0错误");
//	return a / b;
//}
//void Func()
//{
//	//如果new int抛出了std::bad_alloc异常，那么构造函数将会立即终止执行，这里没有 try—catch 处理异常，程序将会终止
//
//	//而new抛出异常后，SmartPtr的构造函数并没有完成其执行，析构函数不会被调用，可放心使用。
//	SmartPtr<int> p1(new int);
//	SmartPtr<int> p2(new int);
//	SmartPtr<int> p3(new int);
//
//	cout << div() << endl;
//}
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (exception& e) //C++动态库中的异常体系（父子进程关系）
//	{
//		cout << e.what() << endl;
//	}
//	return 0;
//}

//int main()
//{
//	auto_ptr<int> sp1(new int(1));
//	//将sp1的所有资源全部给sp2，sp1悬空，类似与移动语义
//	auto_ptr<int> sp2(sp1);
//
//	auto_ptr<int> sp3(new int(2));
//	auto_ptr<int> sp4(new int(3));
//
//	sp3 = sp4;
//
//	*sp2 += 10;
//	*sp1 += 10;
//	return 0;
//}

//int main()
//{
//	//拷贝构造
//	bit::auto_ptr<int> p1(new int(1));
//	bit::auto_ptr<int> p2(p1);
//	//赋值运算符
//	bit::auto_ptr<int> p3(new int(2));
//	bit::auto_ptr<int> p4(new int(3));
//	p3 = p4;
//
//	*p2 += 10;
//	*p3 += 10;
//	cout << *p2 << "  " << *p3 << endl;
//	return 0;
//}

